package com.alecgorge.minecraft.jsonapi;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.nio.channels.NotYetConnectedException;
import java.util.Properties;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import com.alecgorge.minecraft.jsonapi.streams.StreamingResponse;
public class JSONWebSocketServer extends WebSocketServer {
JSONServer jsonServer;
public JSONWebSocketServer (int port, JSONServer jsonServer) {
super(JSONAPI.instance.bindAddress != null ? new InetSocketAddress(JSONAPI.instance.bindAddress, port) : new InetSocketAddress(port));
this.jsonServer = jsonServer;
}
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
// TODO Auto-generated method stub
}
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
// TODO Auto-generated method stub
}
@Override
public void onMessage(final WebSocket conn, String message) {
String[] split = message.split("\\?", 2);
NanoHTTPD.Response r = null;
if(split.length < 2) {
r = jsonServer.new Response( NanoHTTPD.HTTP_NOTFOUND, NanoHTTPD.MIME_JSON, jsonServer.returnAPIError("", "Incorrect. Socket requests are in the format PAGE?ARGUMENTS. For example, /api/subscribe?source=....").toJSONString());
}
else {
Properties header = new Properties();
NanoHTTPD.decodeParms(split[1], header);
Properties p = new Properties();
p.put("X-REMOTE-ADDR", conn.getRemoteSocketAddress().getAddress().getHostAddress());
r = jsonServer.serve(split[0], "GET", p, header);
}
if(r.data instanceof StreamingResponse) {
final StreamingResponse s = (StreamingResponse)r.data;
(new Thread(new Runnable() {
@Override
public void run() {
String line = "";
boolean continueSending = true;
while((line = s.nextLine()) != null && continueSending) {
try {
if(conn.isOpen()) {
conn.send(line.trim()+"\r\n");
}
else {
continueSending = false;
}
} catch (NotYetConnectedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
})).start();
}
else {
BufferedReader data;
if(r.data != null)
data = new BufferedReader(new InputStreamReader(r.data));
else
data = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(r.bytes)));
try {
String line = "";
while((line = data.readLine()) != null) {
conn.send(line+"\r\n");
}
}
catch (IOException e) {
conn.close(0);
} catch (NotYetConnectedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void onError(WebSocket conn, Exception ex) {
// TODO Auto-generated method stub
}
}